package co.com.smart.eagle.server.servicehandler;


import javax.ejb.EJBException;
import javax.ejb.EJBTransactionRolledbackException;

import co.com.smart.eagle.client.ParametroHandler;
import co.com.smart.eagle.infrastructure.dto.SmartExcepcionSerializada;

public class InvocationUtil
{

	
	public interface Ejecutar <T>
	{
		public T getResultado() throws Exception;
	}	
	private InvocationUtil()
	{
		
	}
	
	public static <T> ParametroHandler<T> invocarMetodo(Ejecutar<T> ejecucion, String mensaje)
	{
		ParametroHandler<T> param = new ParametroHandler<T>();		
		try 
		{
			param.setParametroRetorno(ejecucion.getResultado());			
		}
		catch (EJBException e)
		{
			if (e.getCause() instanceof SmartExcepcionSerializada)
			{
				param.setSmartExcepcionSerializada((SmartExcepcionSerializada)e.getCause());
			}
			else if (e.getCause() instanceof EJBTransactionRolledbackException && ((EJBTransactionRolledbackException)e.getCause()).getCause() instanceof SmartExcepcionSerializada )
			{
				param.setSmartExcepcionSerializada((SmartExcepcionSerializada)((EJBTransactionRolledbackException)e.getCause()).getCause());
			}else{
			
				e.printStackTrace();
				SmartExcepcionSerializada ex = new SmartExcepcionSerializada();
				ex.setMensaje(mensaje);
				param.setSmartExcepcionSerializada(ex);
			}
		}
		catch (Exception e) 
		{	
			if (e.getCause() instanceof SmartExcepcionSerializada)
			{
				param.setSmartExcepcionSerializada((SmartExcepcionSerializada)e.getCause());
			}
			else if (e.getCause() instanceof EJBTransactionRolledbackException && ((EJBTransactionRolledbackException)e.getCause()).getCause() instanceof SmartExcepcionSerializada )
			{
				param.setSmartExcepcionSerializada((SmartExcepcionSerializada)((EJBTransactionRolledbackException)e.getCause()).getCause());
			}else{
				e.printStackTrace();
				SmartExcepcionSerializada ex = new SmartExcepcionSerializada();
				ex.setMensaje(mensaje);
				param.setSmartExcepcionSerializada(ex);
			}
		}		
		return param;
	}
	
	
}
